﻿Imports System.Xml
Imports System.Text.RegularExpressions
Imports System.IO
Imports System.Xml.Serialization
Imports System.Text
Imports WSEntidades

Public Class Santander1

#Region "Metodos_Validacion"
    Public Function isValid_InfoPago(ByRef Resp As List(Of RespuestaPremium), _
                                       ByVal AddSantander As Santander.TAddendaSantanderV1) As Boolean
        Dim msgError As String = ""
        Try
            If (AddSantander.InformacionPago(0).email <> "") Then
                If Not (valida_Correo(AddSantander.InformacionPago(0).email)) Then
                    msgError &= "El E-Mail del Informacion Pago tiene una estructura incorrecta." & vbCrLf
                End If
            End If

            If (msgError = "") Then
                isValid_InfoPago = True
            Else
                isValid_InfoPago = False
                ValidaCFDi.AgregaRespuesta("10", 0, msgError, Resp)
            End If
        Catch ex As Exception
            isValid_InfoPago = False
            ValidaCFDi.AgregaRespuesta("10", 0, ex.Message, Resp)
        End Try
    End Function
#End Region

    Public Function creaXML(ByVal AddSantander As Santander.TAddendaSantanderV1, ByRef Resp As List(Of RespuestaPremium)) As String
        Dim tmpAddSantander As Santander.TAddendaSantanderV1 = New Santander.TAddendaSantanderV1()
        Dim add As Santander.TAddendaSantanderV1 = New Santander.TAddendaSantanderV1()
        Dim memory_stream As MemoryStream
        Dim xmlNameSpace As XmlSerializerNamespaces
        Dim xmlTextWriter As XmlTextWriter
        Dim xs As XmlSerializer
        Dim stream_reader As StreamReader
        Dim xmlDoc As XmlDocument
        Try
            'INFORMACIONPAGO
            tmpAddSantander.InformacionPago = New Santander.TInformacionPago() {New Santander.TInformacionPago()}
            If (AddSantander.InformacionPago IsNot Nothing) Then
                If (AddSantander.InformacionPago(0).numProveedor IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).numProveedor = AddSantander.InformacionPago(0).numProveedor.Trim
                End If
                If (AddSantander.InformacionPago(0).ordenCompra IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).ordenCompra = AddSantander.InformacionPago(0).ordenCompra.Trim
                End If
                If (AddSantander.InformacionPago(0).posCompra IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).posCompra = AddSantander.InformacionPago(0).posCompra.Trim
                End If
                If (AddSantander.InformacionPago(0).nombreBeneficiario IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).nombreBeneficiario = AddSantander.InformacionPago(0).nombreBeneficiario.Trim
                End If
                If (AddSantander.InformacionPago(0).institucionReceptora IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).institucionReceptora = AddSantander.InformacionPago(0).institucionReceptora.Trim
                End If
                If (AddSantander.InformacionPago(0).numeroCuenta IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).numeroCuenta = AddSantander.InformacionPago(0).numeroCuenta.Trim
                End If
                If (AddSantander.InformacionPago(0).cuentaContable IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).cuentaContable = AddSantander.InformacionPago(0).cuentaContable.Trim
                End If
                If (AddSantander.InformacionPago(0).claveDeposito IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).claveDeposito = AddSantander.InformacionPago(0).claveDeposito.Trim
                End If
                If (AddSantander.InformacionPago(0).email IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).email = AddSantander.InformacionPago(0).email.Trim
                End If
                If (AddSantander.InformacionPago(0).codigoISOMoneda IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).codigoISOMoneda = AddSantander.InformacionPago(0).codigoISOMoneda.Trim
                End If
                If (AddSantander.InformacionPago(0).concepto IsNot Nothing) Then
                    tmpAddSantander.InformacionPago(0).concepto = AddSantander.InformacionPago(0).concepto.Trim
                End If
            End If

            'INFORMACIONEMISION
            'informacion factoraje
            tmpAddSantander.InformacionEmision = New Santander.TInformacionEmision()
            If (AddSantander.InformacionEmision IsNot Nothing) Then
                If (AddSantander.InformacionEmision.InformacionFactoraje IsNot Nothing) Then
                    tmpAddSantander.InformacionEmision.InformacionFactoraje = New Santander.TFactoraje() {New Santander.TFactoraje()}
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).deudorProveedor IsNot Nothing) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).deudorProveedor = AddSantander.InformacionEmision.InformacionFactoraje(0).deudorProveedor.Trim
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).tipoDocumento IsNot Nothing) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).tipoDocumento = AddSantander.InformacionEmision.InformacionFactoraje(0).tipoDocumento.Trim
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).numeroDocumento IsNot Nothing) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).numeroDocumento = AddSantander.InformacionEmision.InformacionFactoraje(0).numeroDocumento.Trim
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).fechaVencimiento IsNot Nothing) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).fechaVencimiento = AddSantander.InformacionEmision.InformacionFactoraje(0).fechaVencimiento
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).plazo <> 0) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).plazo = AddSantander.InformacionEmision.InformacionFactoraje(0).plazo
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).plazoSpecified = True
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).valorNominal <> 0) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).valorNominal = AddSantander.InformacionEmision.InformacionFactoraje(0).valorNominal
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).valorNominalSpecified = True
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).aforo <> 0) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).aforo = AddSantander.InformacionEmision.InformacionFactoraje(0).aforo
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).aforoSpecified = True
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).precioBase <> 0) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).precioBase = AddSantander.InformacionEmision.InformacionFactoraje(0).precioBase
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).precioBaseSpecified = True
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).tasaDescuento <> 0) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).tasaDescuento = AddSantander.InformacionEmision.InformacionFactoraje(0).tasaDescuento
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).tasaDescuentoSpecified = True
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).precioFactoraje <> 0) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).precioFactoraje = AddSantander.InformacionEmision.InformacionFactoraje(0).precioFactoraje
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).precioFactorajeSpecified = True
                    End If
                    If (AddSantander.InformacionEmision.InformacionFactoraje(0).importeDescuento <> 0) Then
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).importeDescuento = AddSantander.InformacionEmision.InformacionFactoraje(0).importeDescuento
                        tmpAddSantander.InformacionEmision.InformacionFactoraje(0).importeDescuentoSpecified = True
                    End If
                End If
            End If
            If (AddSantander.InformacionEmision.codigoCliente IsNot Nothing) Then
                tmpAddSantander.InformacionEmision.codigoCliente = AddSantander.InformacionEmision.codigoCliente.Trim
            End If
            If (AddSantander.InformacionEmision.contrato IsNot Nothing) Then
                tmpAddSantander.InformacionEmision.contrato = AddSantander.InformacionEmision.contrato.Trim
            End If
            If (AddSantander.InformacionEmision.periodo IsNot Nothing) Then
                tmpAddSantander.InformacionEmision.periodo = AddSantander.InformacionEmision.periodo.Trim
            End If
            If (AddSantander.InformacionEmision.centroCostos IsNot Nothing) Then
                tmpAddSantander.InformacionEmision.centroCostos = AddSantander.InformacionEmision.centroCostos.Trim
            End If
            If (AddSantander.InformacionEmision.folioInterno IsNot Nothing) Then
                tmpAddSantander.InformacionEmision.folioInterno = AddSantander.InformacionEmision.folioInterno.Trim
            End If
            If (AddSantander.InformacionEmision.claveSantander IsNot Nothing) Then
                tmpAddSantander.InformacionEmision.claveSantander = AddSantander.InformacionEmision.claveSantander.Trim
            End If


            'INMUEBLES
            tmpAddSantander.Inmuebles = New Santander.TInmuebles()
            If (AddSantander.Inmuebles.fechaVencimiento IsNot Nothing) Then
                tmpAddSantander.Inmuebles.fechaVencimiento = AddSantander.Inmuebles.fechaVencimiento
            End If
            If (AddSantander.Inmuebles.numContrato IsNot Nothing) Then
                tmpAddSantander.Inmuebles.numContrato = AddSantander.Inmuebles.numContrato
            End If

            'BASILEA
            tmpAddSantander.Basilea = New Santander.TBasilea()
            If (AddSantander.Basilea.numContrato IsNot Nothing) Then
                tmpAddSantander.Basilea.numContrato = AddSantander.Basilea.numContrato
            End If
            If (AddSantander.Basilea.OrigenGasto IsNot Nothing) Then
                tmpAddSantander.Basilea.OrigenGasto = AddSantander.Basilea.OrigenGasto
            End If
            If (AddSantander.Basilea.TipoGasto IsNot Nothing) Then
                tmpAddSantander.Basilea.TipoGasto = AddSantander.Basilea.TipoGasto
            End If

            'CAMPOADICIONAL
            If (AddSantander.CampoAdicional IsNot Nothing) Then
                tmpAddSantander.CampoAdicional = New Santander.TCampoAdicional() {New Santander.TCampoAdicional()}
                If (AddSantander.CampoAdicional(0).campo IsNot Nothing) Then
                    tmpAddSantander.CampoAdicional(0).campo = AddSantander.CampoAdicional(0).campo
                End If
                If (AddSantander.CampoAdicional(0).valor IsNot Nothing) Then
                    tmpAddSantander.CampoAdicional(0).valor = AddSantander.CampoAdicional(0).valor
                End If
            End If

            add = tmpAddSantander
            'SERIALIZAR
            memory_stream = New MemoryStream()
            xmlNameSpace = New XmlSerializerNamespaces()
            xmlNameSpace.Add("asant", "http://www.santander.com.mx/schemas/xsd/AddendaSantanderV1")
            xmlTextWriter = New XmlTextWriter(memory_stream, Encoding.UTF8)
            xmlTextWriter.Formatting = Formatting.Indented
            xmlTextWriter.Indentation = 4
            xs = New XmlSerializer(GetType(Santander.TAddendaSantanderV1))
            xs.Serialize(xmlTextWriter, add, xmlNameSpace)
            stream_reader = New StreamReader(memory_stream)
            memory_stream.Seek(0, SeekOrigin.Begin)
            xmlDoc = New XmlDocument
            xmlDoc.LoadXml(stream_reader.ReadToEnd())
            Dim att As XmlAttribute = xmlDoc.CreateAttribute("xsi", "schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")
            att.Value = "http://www.santander.com.mx/schemas/xsd/AddendaSantanderV1 AddendaSantanderV1.xsd"
            xmlDoc.GetElementsByTagName("asant:AddendaSantanderV1").Item(0).Attributes.Append(att)
            Return xmlDoc.DocumentElement.OuterXml '.ToString().Replace("xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""", "")
            xmlTextWriter.Close()
            memory_stream.Close()
            memory_stream.Dispose()
            stream_reader.Close()
            stream_reader.Dispose()
        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("10", 0, "Ocurrió un error al generar la Addenda: " & ex.Message, Resp)
            Return Nothing
        Finally
            memory_stream = Nothing
            xmlNameSpace = Nothing
            xmlTextWriter = Nothing
            xs = Nothing
            stream_reader = Nothing
            xmlDoc = Nothing
            tmpAddSantander = Nothing
        End Try
    End Function

#Region "Metodos_Auxiliares"
    Public Function valida_Correo(ByVal sCorreo As String) As Boolean
        Dim re As Regex = New Regex( _
                            "^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@" & _
                            "[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\." & _
                            "[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$", _
                            RegexOptions.IgnoreCase)
        Dim m As Match = re.Match(sCorreo)
        If m.Captures.Count = 0 Then
            Return False
        Else
            Return True
        End If
    End Function
#End Region
End Class
